
업캐스팅의 유용함
업캐스팅
특정 객체가 하위 클래스의 형에서 상위의 클래스형으로 캐스팅 되는 것 하나의 매개변수의 형으로 여러 형을 받아줄 수 있다.
[만약 C#이 업캐스팅 문법을 지원하지 않을 때 생기는 문제점]
새로운 하위 클래스를 만들 때 마다 ‘동물병원 클래스’ 안에도 그 하위클래스에 맞는 ‘환자추가 함수’ 를 새로 만들어야 한다.
업캐스팅을 하지 않았을 때 생기는 불편함
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 상위클래스
public class Animal
{
}
public class Dog : Animal
{
}
public class Cat : Animal
{
}
public class Rabbit : Animal
{
}
public class 동물1 : Animal
{
}
public class 동물2 : Animal
{
}
public class 동물3 : Animal
{
}
class 동물병원
{
public void 진료(Dog ani)
{
Console.WriteLine("환자 도착 : " + ani);
}
public void 진료(Cat ani)
{
Console.WriteLine("환자 도착 : " + ani);
}
public void 진료(Rabbit ani)
{
Console.WriteLine("환자 도착 : " + ani);
}
}
class main
{
public static void Main(string[] args)
{
Dog d = new Dog();
Cat c = new Cat();
Rabbit r = new Rabbit();
// 이후 소문듣고 몰려온 새 환자들
동물1 a1 = new 동물1();
동물2 a2 = new 동물2();
동물3 a3 = new 동물3();
동물병원 hospital = new 동물병원();
hospital.진료(d);
hospital.진료(c);
hospital.진료(r);
//hospital.진료(a1);
//hospital.진료(a2);
//hospital.진료(a3);
}
}
그래서 열받은 병원장은 업캐스팅을 사용해서 새로운 하위클래스가 추가되더라고 더이상 동물병원 클래스를 고칠 필요가 없도록 수정하였다.
업캐스팅을 한 경우
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 상위클래스
public class Animal
{
}
public class Dog : Animal
{
}
public class Cat : Animal
{
}
public class Rabbit : Animal
{
}
public class 동물1 : Animal
{
}
public class 동물2 : Animal
{
}
public class 동물3 : Animal
{
}
class 동물병원
{
public void 진료(Animal ani)
{
Console.WriteLine("환자 도착 : " + ani);
}
}
class main
{
public static void Main(string[] args)
{
Dog d = new Dog();
Cat c = new Cat();
Rabbit r = new Rabbit();
// 이후 소문듣고 몰려온 새 환자들
동물1 a1 = new 동물1();
동물2 a2 = new 동물2();
동물3 a3 = new 동물3();
동물병원 hospital = new 동물병원();
hospital.진료(d);
hospital.진료(c);
hospital.진료(r);
hospital.진료(a1);
hospital.진료(a2);
hospital.진료(a3);
}
}
인터페이스와 추상클래스의 업캐스팅 차이
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 인터페이스
public interface 인터페이스
{
void 추상함수1(); // abstract를 굳이 안 붙인다 (어차피 100% 추상함수밖에 없으므로)
}
// 추상클래스
public abstract class 추상클래스
{
// 추상함수
public abstract void 추상함수2();
// 일반함수도 존재할 수 있다
}
public class 하위클래스 : 추상클래스, 인터페이스
{
public void 추상함수1()
{
Console.WriteLine("인터페이스에 있던 추상함수");
}
public override void 추상함수2()
{
Console.WriteLine("추상클래스에 있던 추상함수");
}
}
public class TestMain
{
public static void Main(string[] args)
{
하위클래스 하위 = new 하위클래스();
// 1. 인터페이스의 업캐스팅 예시
인터페이스 up1 = 하위; // 인터페이스 : 상위클래스
up1.추상함수1();
// 2. 추상클래스의 업캐스팅 예시
추상클래스 up2 = 하위; // 추상클래스 : 상위클래스
up2.추상함수2();
}
}